﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CeA.Reports.Atendimento.DataAccess;
using CeA.Reports.Atendimento.DataAccess.DAO;
using CeA.Reports.Atendimento.DataAccess.Criteria;
using CeA.Reports.Atendimento.DataAccess.DAO.Oracle;

namespace CeA.Reports.Atendimento.Web.WebControls {
    public partial class FiltroEspecialista : System.Web.UI.UserControl {
        
        #region -- Event Model ------------------------------------------------

            // Event Keys
            private static readonly object PesquisarEventKey = new object();

            
            // Delegates
            public delegate void PesquisarEventHandler(object sender, PesquisarEventArgs e);


            // Events
            public event PesquisarEventHandler Pesquisar {
                add {
                    Events.AddHandler(PesquisarEventKey, value);
                }
                remove {
                    Events.RemoveHandler(PesquisarEventKey, value);
                }
            }


            protected virtual void OnPesquisar(PesquisarEventArgs e) {
                PesquisarEventHandler handler = Events[PesquisarEventKey] as PesquisarEventHandler;
                if (handler != null) {
                    handler(this, e);
                }
            }
        #endregion


        protected void Page_Init()                                                      {
            lstEspecialista.SelectedIndexChanged += new EventHandler(lstEspecialista_SelectedIndexChanged);
            btnPesquisar.Click += new EventHandler(btnPesquisar_Click);
        }


        protected void Page_Load(object sender, EventArgs e)                            {
            if (Page.IsPostBack == false) {
                CarregaAllEspecialistaListBox();
                CarregaAllLojaListBox();
                txtHoraInicio.Text = "08:00:00";
                txtHoraFinal.Text = "23:00:00";
                txtTempoEsperaMaior.Text = "01:00:00";
                txtTempoAtendimentoMaior.Text = "01:00:00";
                txtIndiceDesistencia.Text = "40";
                txtDataInicio.Focus();
            }
        }


        private string DateTime()                                                       
        {
            throw new NotImplementedException();
        }


        protected void lstEspecialista_SelectedIndexChanged(object sender, EventArgs e) {
            CarregaAllLojaListBox();
        }
       

        private void btnPesquisar_Click(object sender, EventArgs e)                     {
            TempoAtendimentoFilter filter = new TempoAtendimentoFilter();

            if (lstEspecialista.SelectedIndex > 0) {
                foreach (ListItem item in lstEspecialista.Items)
                {
                    if (item.Selected)
                        filter.addEspecialista(Convert.ToInt32(item.Value));
                }
            }

            if (lstLoja.SelectedIndex > 0) {
                foreach (ListItem item in lstLoja.Items) {
                    if (item.Selected)
                        filter.addLoja(Convert.ToInt32(item.Value));
                }
            }

            try {
                filter.setDataInicial(txtDataInicio.Text);
                filter.setDataFinal(txtDataFim.Text);
                filter.TempoEsperaMaiorFormatado = txtTempoEsperaMaior.Text;
                filter.TempoAtendimentoMaiorFormatado = txtTempoAtendimentoMaior.Text;

                if (txtHoraInicio.Text.Trim().Length > 0)
                    filter.setHoraInicial(txtHoraInicio.Text);

                if (txtHoraFinal.Text.Trim().Length > 0)
                    filter.setHoraFinal(txtHoraFinal.Text);

                int indiceDesistencia = 0;

                if (int.TryParse(txtIndiceDesistencia.Text, out indiceDesistencia)) {
                    filter.TempoAtendimento = indiceDesistencia;
                } else {
                    throw new ArgumentException("O Indice de Desistência deve ser numérico.");
                }

                PesquisarEventArgs args = new PesquisarEventArgs(filter);
                args.GerarGrafico = chkShowChart.Checked;
                
                OnPesquisar(args);

            } catch (Exception ex) {
                cvlMensagem.IsValid = false;
                cvlMensagem.Text = ex.Message;
            }
        }


        private void CarregaAllEspecialistaListBox()                                    {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);
            Especialista daoEspecialista = factory.GetEspecialistaDAO();
            EspecialistaCriteria criteria = new EspecialistaCriteria();

            lstEspecialista.DataSource = daoEspecialista.ListarIdentificacao(criteria);
            lstEspecialista.DataTextField = "sigla";
            lstEspecialista.DataValueField = "id";

            lstEspecialista.DataBind();
            lstEspecialista.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }
        

        private void CarregaAllLojaListBox()                                            {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);

            Loja daoLoja = factory.GetLojaDAO();
            LojaCriteria criteria = new LojaCriteria();

            //Especialista
            if (lstEspecialista.SelectedIndex > 0)
                foreach (ListItem item in lstEspecialista.Items)
                {
                    if (item.Selected)
                        criteria.addEspecialista(Convert.ToInt32(item.Value));
                }

            lstLoja.DataSource = daoLoja.ListarIdentificacao(criteria);
            lstLoja.DataTextField = "nome";
            lstLoja.DataValueField = "id";

            lstLoja.DataBind();
            lstLoja.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }
    }
}